from django.template import Library
from django.conf import settings
from django.utils.safestring import mark_safe
from django.urls import reverse
from django.http import QueryDict

register = Library()

def check_permission(request, name):
    role = request.fc_user.role
    permission = settings.FC_PERMISSION[role]
    if name in permission:
        return True

    if name in settings.FC_PERMISSION_PUBLIC:
        return True

@register.simple_tag
def add_permission(request, name,*args, **kwargs):
    if not check_permission(request, name):
        return ''

    url = reverse(name,*args, **kwargs)
    tpl = """
    <a href="{}" class="btn btn-success">
             <span class="glyphicon glyphicon-plus-sign"></span> 新建
    </a>
    """.format(url)
    return mark_safe(tpl)

@register.filter()
def has_permission(request, others):
    url_list = others.split(',')
    for url in url_list:
        if check_permission(request, url):
            return True
    return False

@register.simple_tag
def edit_permission(request, name,*args, **kwargs):
    if not check_permission(request, name):
        return ''
    url = reverse(name, args=args, kwargs=kwargs)
    """
    当用户在列表页进行筛选操作后，点击某条记录的编辑按钮时，需要在编辑链接中保留之前的筛选条件，以便编辑完成返回列表页时能继续显示符合筛选条件的记录。
    """
    # 1. 获取当前请求的 GET 参数并编码
    # urlencode() 方法将这个字典对象转换为 URL 编码的字符串，例如，如果 request.GET 是 {'status': 'active', 'page': 2}，那么 param 将会是 'status=active&page=2'。
    param = request.GET.urlencode()

    # 2. 判断是否存在 GET 参数
    # 如果 param 不为空字符串，说明当前请求带有 GET 参数，可能是用户进行了筛选操作。
    if param:
        # 3. 创建一个可修改的 QueryDict 对象并添加过滤参数
        """
        QueryDict 是 Django 中用于处理查询字符串的类，默认情况下它是不可变的，所以通过 mutable=True 参数创建一个可变的 QueryDict 对象 new_query_dict。
        将之前获取并编码好的 GET 参数作为 _filter 键的值添加到 new_query_dict 中。
        """
        new_query_dict = QueryDict(mutable=True)
        new_query_dict['_filter'] = param

        # 4. 对新的查询字典进行 URL 编码
        # 将 new_query_dict 转换为 URL 编码的字符串，例如，如果 new_query_dict 是 {'_filter': 'status=active&page=2'}，那么 filter_string 将会是 '_filter=status%3Dactive%26page%3D2'。
        filter_string = new_query_dict.urlencode()

        # 5. 生成带有过滤参数的编辑链接
        tpl = """<a href="{}?{}" class="btn btn-primary btn-xs">编辑</a>""".format(url, filter_string)
        # mark_safe 函数用于告诉 Django 这个字符串是安全的，不需要进行 HTML 转义，可以直接渲染为 HTML 标签。
        return mark_safe(tpl)

    # 6. 若不存在 GET 参数，生成普通编辑链接
    tpl = """<a href="{}" class="btn btn-primary btn-xs">编辑</a>""".format(url)
    return mark_safe(tpl)

@register.simple_tag
def delete_permission(request, name,*args, **kwargs):
    if not check_permission(request, name):
        return ''
    pk = kwargs.get('pk')
    tpl = """
    <a cid="{}" class="btn btn-danger btn-xs btn-delete">删除</a>
    """.format(pk)
    return mark_safe(tpl)

@register.simple_tag
def delete_url_permission(request, name,*args, **kwargs):
    if not check_permission(request, name):
        return ''
    url = reverse(name, args=args, kwargs=kwargs)
    # url = reverse(name,*args, **kwargs) 容易报错
    tpl = """
    <a href="{}" class="btn btn-danger btn-xs btn-delete">删除</a>
    """.format(url)
    return mark_safe(tpl)

